import config from 'config';

function getStorage(key) {
	return uni.getStorageSync(`$${config.clientId}_${key}`);
}

function setStorage(options, value) {
	if (typeof options === 'string')
		return uni.setStorageSync(`$${config.clientId}_${options}`, value);
	if (options.key) options.key = `$${config.clientId}_${options.key}`;
	uni.setStorage(options);
}

function removeStorage(options) {
	if (typeof options === 'string')
		return uni.removeStorageSync(`$${config.clientId}_${options}`);
	if (options.key) options.key = `$${config.clientId}_${options.key}`;
	uni.removeStorage(options);
}

function queryStringToObject(str) {
	var obj = {}
	var splitStringArray = str.substring(str.indexOf("?") + 1).split('&');
	splitStringArray.forEach(item => {
		if (item) {
			var kv = item.split('=');
			obj[kv[0]] = kv[1];
		}
	});
	return obj;
}

function objectToQueryString(obj) {
	var queryString = '?';
	for (let key in obj) {
		queryString += `${key}=${obj[key]}&`;
	}
	queryString = queryString.replace(/&$/, '');
	if (queryString === '?') {
		queryString = '';
	}
	return queryString;
}

function queryStringRemoveParams(url, names) {
	if (typeof(names) === 'string') {
		names = [names];
	}
	var obj = queryStringToObject(url);
	for (var i = 0; i < names.length; i++) {
		delete obj[names[i]];
	}
	return objectToQueryString(obj);
}

function toErrorPage(code, message) {
	uni.redirectTo({
		url: `/pages/error/error?code=${code}&message=${message}`
	});
}

function toLinkPage(link, title) {
	if (!link) return
	if (!title) title = config.appName
	if (link.startsWith('/')) {
		uni.navigateTo({
			url: link
		});
	} else {
		uni.navigateTo({
			url: `/pages/webview/webview?link=${link}&title=${title}`
		});
	}
}

function navigateBack() {
	var pages = getCurrentPages();
	if (pages.length > 1) {
		uni.navigateBack();
	} else {
		uni.reLaunch({
			url: '/'
		});
	}
}

// 日期格式化
function parseTime(time, pattern) {
    if (arguments.length === 0 || !time) {
        return null
    }
    const format = pattern || '{y}/{m}/{d} {h}:{i}'
    let date
    if (typeof time === 'object') {
        date = time
    } else {
        if ((typeof time === 'string') && (/^[0-9]+$/.test(time))) {
            time = parseInt(time)
        } else if (typeof time === 'string') {
            time = time.replace(new RegExp(/-/gm), '/');
        }
        if ((typeof time === 'number') && (time.toString().length === 10)) {
            time = time * 1000
        }
        date = new Date(time)
    }
    const formatObj = {
        y: date.getFullYear(),
        m: date.getMonth() + 1,
        d: date.getDate(),
        h: date.getHours(),
        i: date.getMinutes(),
        s: date.getSeconds(),
        a: date.getDay()
    }
    const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {
        let value = formatObj[key]
            // Note: getDay() returns 0 on Sunday
        if (key === 'a') { return ['日', '一', '二', '三', '四', '五', '六'][value] }
        if (result.length > 0 && value < 10) {
            value = '0' + value
        }
        return value || 0
    })
    return time_str
}

/**
 * 构造树型结构数据
 * @param {*} data 数据源
 * @param {*} id id字段 默认 'id'
 * @param {*} parentId 父节点字段 默认 'parentId'
 * @param {*} children 孩子节点字段 默认 'children'
 * @param {*} rootId 根Id 默认 0
 */
function handleTree(data, id, parentId, children, rootId) {
    id = id || 'id'
	parentId = parentId || 'parentId'
	children = children || 'children'
	rootId = rootId || Math.min.apply(Math, data.map(item => { return item[parentId] })) || 0
		//对源数据深度克隆
	const cloneData = JSON.parse(JSON.stringify(data))
		//循环所有项
	const treeData = cloneData.filter(father => {
		let branchArr = cloneData.filter(child => {
			//返回每一项的子级数组
			return father[id] == child[parentId]
		});
		branchArr.length > 0 ? father.children = branchArr : '';
		//返回第一层
		return father[parentId] == rootId;
	});
	return treeData != '' ? treeData : data;
}

// 回显数据字典
function selectDictLabel(datas,value,label='dictLabel',val='dictValue'){
    var actions = [];
    Object.keys(datas).some((key) => {
        if (datas[key][val] == ('' + value)) {
            actions.push(datas[key][label]);
            return true;
        }
    })
    return actions.join('');
}

export default {
	getStorage,
	setStorage,
	removeStorage,
	queryStringToObject,
	objectToQueryString,
	queryStringRemoveParams,
	toErrorPage,
	toLinkPage,
	navigateBack,
	parseTime,
	handleTree,
	selectDictLabel
}
